package prh25.biblioteca.service;

import java.util.List;

import org.apache.commons.validator.GenericValidator;

import prh25.biblioteca.entity.Aluno;
import prh25.biblioteca.entity.Coordenador;
import prh25.biblioteca.entity.Documento;
import prh25.biblioteca.entity.Endereco;
import prh25.biblioteca.entity.Usuario;
import prh25.biblioteca.entity.dao.CoordenadorDAO;
import prh25.biblioteca.entity.dao.UsuarioDAO;
import prh25.biblioteca.entity.dao.hibernate.HibernateDAOFactory;
import prh25.biblioteca.entity.dao.hibernate.HibernateUtil;
import prh25.biblioteca.service.exception.RestricaoIntegridadeException;
import prh25.biblioteca.service.exception.UsuarioExistenteException;

public class CoordenadorServiceImpl implements CoordenadorService {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private CoordenadorDAO coordenadorDAO;
	
	public void setCoordenadorDAO(CoordenadorDAO coordenadorDAO) {
		this.coordenadorDAO = coordenadorDAO;
	}
	
	@Override
	/**
	 * Salva um aluno no banco de dados.
	 * @param coordenador - Coordenador a ser inserido no banco de dados.
	 * @return Id do coordenador se foi inserido com sucesso.
	 */
	public Integer criar(Coordenador coordenador) {
		
		coordenador.getEndereco().uid();
		
		validar(coordenador);
		setCoordenadorDAO(HibernateDAOFactory.DEFAULT.buildCoordenadorDAO());
		checkDuplicidade(coordenador);
		// Inicio da transacao

		try {
			HibernateUtil.beginTransaction();
			coordenadorDAO.saveOrUpdate(coordenador);
			HibernateUtil.commitTransaction();
		} catch (Exception ex) {
			ex.printStackTrace();
			HibernateUtil.rollbackTransaction();
			// Aqui deve ser adiconada o url de aviso de erro
		}finally{
			HibernateUtil.getSession().flush();
			HibernateUtil.getSession().clear();
		}		
		return coordenador.getId();
	}
	
	
	/**
	 * Valida os dados de um coordenador.
	 * @param coordenador - Coordenador a ter os dados validados.
	 * @throws RestricaoIntegridadeException - Excecao lancada se houve alguma
	 * restricao de integridade.
	 */
	private void validar(Coordenador coordenador) throws RestricaoIntegridadeException {
		
		if (GenericValidator.isBlankOrNull(coordenador.getEmail()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(coordenador.getNome()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(coordenador.getLogin()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (GenericValidator.isBlankOrNull(coordenador.getSenha()))
			throw new RestricaoIntegridadeException("Dados incompleto");
		if (!GenericValidator.isEmail(coordenador.getEmail()))
			throw new RestricaoIntegridadeException("Nao eh um email valido.");
	}
	
	/**
	 * Verifica se o coordenador a ser inserido no banco de dados jah existe.
	 * @param coordenador - Coordenador a ser inserido.
	 */
	private void checkDuplicidade(Coordenador coordenador) {
		UsuarioDAO usuarioDAO = HibernateDAOFactory.DEFAULT.buildUsuarioDAO();
		
		List<Usuario> logins = usuarioDAO.findByLogin(coordenador.getLogin());
		
		if (!logins.isEmpty()) 
			throw new UsuarioExistenteException("Usuario ja existe");
		
	}
	
	/**
	 * Busca os usuarios por uma palavra de pesquisa.
	 * @param pesquisa - Palavra a ser procurada no nome dos usuarios.
	 * @return - Uma lista de usuarios que contenham a palavra pesquisada.
	 */
	@Override
	public List<Usuario> listarUsuarios(String pesquisa) {
		// TODO Auto-generated method stub
		UsuarioService servico = new UsuarioServiceImpl();
		return servico.listarUsuarios(pesquisa);
	}

	@Override
	public Usuario setSituacaoUsuario(String login, boolean situacao) {
		// TODO Auto-generated method stub
		UsuarioService servico = new UsuarioServiceImpl();
		return servico.setSituacaoUsuario(login, situacao);
	}

	@Override
	/**
	 * Deleta um usuario do banco de dados.
	 * @param login - O login do usuario que sera excluido.
	 */
	public boolean excluirUsuario(String login) {
		// TODO Auto-generated method stub
		UsuarioService servico = new UsuarioServiceImpl();
		return servico.excluirUsuario(login);
	}

	@Override
	/**
	 * Salva um arquivo no banco de dados.
	 * @param documento - Documento a ser salvo no banco de dados.
	 * @param diretorioAplicacao - diretorio onde se encontra o arquivo.
	 * @return True se o arquivo foi salvo com sucesso, false caso contrario.
	 */
	public boolean finalizarEnvioArquivo(Documento documento, String diretorioAplicacao) {
		DocumentoService servico = new DocumentoServiceImpl();
		return servico.finalizarEnvioArquivo(documento, diretorioAplicacao);
	}

}
